﻿using System;
using System.Collections.Generic;
using System.Xml.Schema;

namespace _88_自定义相等比较_集合
{
    class Program
    {
        static void Main(string[] args)
        {

            //比较分析，一旦相同，则忽略不输出。

            HashSet<Contact> 比较分析 = new HashSet<Contact>(new ContactEqualityComparer());

            //执行五次添加元素的操作
            比较分析.Add(new Contact
            {
                ID = 721001,
                Name="老李",
                PhoneNo="2234456988"

            });//第一次添加

            //添加相同的实例
            Contact 第一个数据 = new Contact
            {
                ID = 7412002,
                Name = "老何",
                PhoneNo = "12536666"
            };

            Contact 第二个数据 = 第一个数据;
            比较分析.Add(第一个数据); //第二次添加
            比较分析.Add(第二个数据);   //第三次添加

            //不同实例，但属性值相同
            Contact 第三个数据 = new Contact
            {
                ID = 5002,
                Name = "老肖",
                PhoneNo = "147255522"
            };
            Contact 第四个数据 = new Contact
            {
                ID = 5002,
                Name = "老肖",
                PhoneNo = "147255522"
            };
            比较分析.Add(第三个数据);
            比较分析.Add(第四个数据);


            //输出集合所有元素
            foreach (Contact c in 比较分析)
            {
                string 出来吧 = $"身份标识:{c.ID}\n" + $"姓名：{c.Name}\n" + $"手机:{c.PhoneNo}\n";
                Console.WriteLine(出来吧);
            }
            Console.Read();
        }
    }

    //自定义类，模拟联系人信息
    public class Contact
    {
        public string Name { get; set; }
        public string PhoneNo { get; set; }
        public long ID { get; set; }
    }

    //实现EqualityComperer<T>抽象类，实现两个Contact对象的相等比较，T的参数类型为Contact
    public sealed class ContactEqualityComparer : EqualityComparer<Contact>
    {
        public override bool Equals(Contact x, Contact y)
        {
            if (x == null || y == null)
                return false;
            if (object.ReferenceEquals(x, y))
                return true;
            if (x.ID == y.ID && x.Name == y.Name && x.PhoneNo == y.PhoneNo)
                return true;
            return false;
        }

        public override int GetHashCode(Contact obj)
        {
            return obj.ID.GetHashCode() ^ obj.Name.GetHashCode() ^ obj.PhoneNo.GetHashCode();
        }
    }

}

